// IO.cpp: implementation of the CIO class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include <assert.h>
#include "../MoldingOHT.h"
#include "IO.h"
#include "IO_def.h"
#include "../CrevisFnIO/Fnio.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CIO::CIO()
{

	DevInfo.IpAddress[0] = 192;
	DevInfo.IpAddress[1] = 168;
	DevInfo.IpAddress[2] = 123;
	DevInfo.IpAddress[3] = 1;
	DevOpenDevice();
}

CIO::~CIO(){}

void CIO::DevOpenDevice()
{
	int ret;
	ret = Fnio.DevOpenDevice(&DeviceID, DevInfo);
	if (!ret)
	{
		m_BDeviceOpened = TRUE;
	}
	else
	{
		m_BDeviceOpened = FALSE;
	}

}

BOOL CIO::IsOn(unsigned short usIOAddr)
{		
	ASSERT(usIOAddr >= IN_NO && usIOAddr <= IO_END_NO);
	BOOL bBitVal;
	if (usIOAddr >= IN_EX1  && usIOAddr <IN_EX2)
	{
		usIOAddr = usIOAddr - IN_EX1;
		Fnio.IoReadInputBitData(DeviceID, 0, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= IN_EX2  && usIOAddr <IN_EX3)
	{
		usIOAddr = usIOAddr - IN_EX2;
		Fnio.IoReadInputBitData(DeviceID, 1, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= IN_EX3  && usIOAddr <IN_EX4)
	{
		usIOAddr = usIOAddr - IN_EX3;
		Fnio.IoReadInputBitData(DeviceID, 2, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= IN_EX4  && usIOAddr <IN_EX5)
	{
		usIOAddr = usIOAddr - IN_EX4;
		Fnio.IoReadInputBitData(DeviceID, 3, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= IN_EX5  && usIOAddr <IN_EX6)
	{
		usIOAddr = usIOAddr - IN_EX5;
		Fnio.IoReadInputBitData(DeviceID, 4, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= IN_EX6  && usIOAddr <IN_EX7)
	{
		usIOAddr = usIOAddr - IN_EX6;
		Fnio.IoReadInputBitData(DeviceID, 5, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= IN_EX7  && usIOAddr <OUT_EX1)
	{
		usIOAddr = usIOAddr - IN_EX7;
		Fnio.IoReadInputBitData(DeviceID, 6, usIOAddr, &bBitVal);
	}


//	else if (usIOAddr >= IN_EX4  && usIOAddr <OUT_EX1)
//	{
//		usIOAddr = usIOAddr - IN_EX4;
//		Fnio.IoReadInputBitData(DeviceID, 3, usIOAddr, &bBitVal);
//	}

	if (usIOAddr >= OUT_EX1  && usIOAddr <OUT_EX2)
	{
		usIOAddr = usIOAddr - OUT_EX1;
		Fnio.IoReadOutputBitData(DeviceID, 0, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= OUT_EX2  && usIOAddr <OUT_EX3)
	{
		usIOAddr = usIOAddr - OUT_EX2;
		Fnio.IoReadOutputBitData(DeviceID, 1, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= OUT_EX3  && usIOAddr <OUT_EX4)
	{
		usIOAddr = usIOAddr - OUT_EX3;
		Fnio.IoReadOutputBitData(DeviceID, 2, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= OUT_EX4  && usIOAddr <OUT_EX5)
	{
		usIOAddr = usIOAddr - OUT_EX4;
		Fnio.IoReadOutputBitData(DeviceID, 3, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= OUT_EX5  && usIOAddr <OUT_EX6)
	{
		usIOAddr = usIOAddr - OUT_EX5;
		Fnio.IoReadOutputBitData(DeviceID, 4, usIOAddr, &bBitVal);
	}
	else if (usIOAddr >= OUT_EX6  && usIOAddr <IO_END_NO)
	{
		usIOAddr = usIOAddr - OUT_EX6;
		Fnio.IoReadOutputBitData(DeviceID, 5, usIOAddr, &bBitVal);
	}
	
//	else if (usIOAddr >= OUT_EX4  && usIOAddr <IO_END_NO)
//	{
//		usIOAddr = usIOAddr - OUT_EX4;
//		Fnio.IoReadOutputBitData(DeviceID, 3, usIOAddr, &bBitVal);
//	}
	return bBitVal;
}

void CIO::OutputOn(unsigned short usIOAddr)
{
	if (usIOAddr >= OUT_EX1  && usIOAddr <OUT_EX2)
	{
		usIOAddr = usIOAddr - OUT_EX1;
		Fnio.IoWriteOutputBitData(DeviceID, 0, usIOAddr, TRUE);
	}
	else if (usIOAddr >= OUT_EX2  && usIOAddr <OUT_EX3)
	{
		usIOAddr = usIOAddr - OUT_EX2;
		Fnio.IoWriteOutputBitData(DeviceID, 1, usIOAddr, TRUE);
	}
	else if (usIOAddr >= OUT_EX3  && usIOAddr <OUT_EX4)
	{
		usIOAddr = usIOAddr - OUT_EX3;
		Fnio.IoWriteOutputBitData(DeviceID, 2, usIOAddr, TRUE);
	}
	else if (usIOAddr >= OUT_EX4  && usIOAddr <OUT_EX5)
	{
		usIOAddr = usIOAddr - OUT_EX4;
		Fnio.IoWriteOutputBitData(DeviceID, 3, usIOAddr, TRUE);
	}
	else if (usIOAddr >= OUT_EX5  && usIOAddr <OUT_EX6)
	{
		usIOAddr = usIOAddr - OUT_EX4;
		Fnio.IoWriteOutputBitData(DeviceID, 4, usIOAddr, TRUE);
	}
	else if (usIOAddr >= OUT_EX6  && usIOAddr <IO_END_NO)
	{
		usIOAddr = usIOAddr - OUT_EX4;
		Fnio.IoWriteOutputBitData(DeviceID, 5, usIOAddr, TRUE);
	}


//	else if (usIOAddr >= OUT_EX4  && usIOAddr <IO_END_NO)
//	{
//		usIOAddr = usIOAddr - OUT_EX4;
//		Fnio.IoWriteOutputBitData(DeviceID, 3, usIOAddr, TRUE);
//	}

}

void CIO::OutputOff(unsigned short usIOAddr)
{
	if (usIOAddr >= OUT_EX1  && usIOAddr <OUT_EX2)
	{
		usIOAddr = usIOAddr - OUT_EX1;
		Fnio.IoWriteOutputBitData(DeviceID, 0, usIOAddr, FALSE);
	}
	else if (usIOAddr >= OUT_EX2  && usIOAddr <OUT_EX3)
	{
		usIOAddr = usIOAddr - OUT_EX2;
		Fnio.IoWriteOutputBitData(DeviceID, 1, usIOAddr, FALSE);
	}
	else if (usIOAddr >= OUT_EX3  && usIOAddr <OUT_EX4)
	{
		usIOAddr = usIOAddr - OUT_EX3;
		Fnio.IoWriteOutputBitData(DeviceID, 2, usIOAddr, FALSE);
	}
	else if (usIOAddr >= OUT_EX4  && usIOAddr <OUT_EX5)
	{
		usIOAddr = usIOAddr - OUT_EX4;
		Fnio.IoWriteOutputBitData(DeviceID, 3, usIOAddr, FALSE);
	}
	else if (usIOAddr >= OUT_EX5  && usIOAddr <OUT_EX6)
	{
		usIOAddr = usIOAddr - OUT_EX5;
		Fnio.IoWriteOutputBitData(DeviceID, 4, usIOAddr, FALSE);
	}
	else if (usIOAddr >= OUT_EX6  && usIOAddr <IO_END_NO)
	{
		usIOAddr = usIOAddr - OUT_EX6;
		Fnio.IoWriteOutputBitData(DeviceID, 5, usIOAddr, FALSE);
	}

	
//	else if (usIOAddr >= OUT_EX4  && usIOAddr <IO_END_NO)
//	{
//		usIOAddr = usIOAddr - OUT_EX4;
//		Fnio.IoWriteOutputBitData(DeviceID, 3, usIOAddr, FALSE);
//	}
}

void CIO::OutputToggle(unsigned short usIOAddr)
{
	if (IsOn(usIOAddr))	OutputOff(usIOAddr);
	else				OutputOn(usIOAddr);
}

void CIO::RunIOThread()
{
	UINT sRet;
	ULONG	StartTime, EndTime;
	double ScanTime;

	StartTime = GetTickCount();
	while(1)
	{
		sRet = IsOn(IN_NO);
		if( sRet != IO_ERROR ) 	break;
		
		EndTime = GetTickCount();
		EndTime -= StartTime;
		ScanTime = (double)EndTime / (double)CLK_TCK;
		
		if( ScanTime >= 10.0 )
		{

		}
		
	}

	Sleep(500);

	AfxBeginThread(IOThread, this);
}

UINT CIO::IOThread(LPVOID lParam)
{
	CIO * This = (CIO *) lParam;
	if( lParam != NULL ) {}

	while(This->m_BDeviceOpened)
	{
	
	//	if( DevExchangeIO(This->m_usBoardNumber,
	//				  0,							/* usSendOffset    */
	//				  MAX_DEVICE * 4,				/* usSendSize      */
	//				  &This->m_ucOutgoingBuffer[0],		/* *pvSendData     */
	//				  0,							/* usReceiveOffset */
	//				  MAX_DEVICE * 4,				/* usReceiveSize   */
	//				  &This->m_ucIncomingBuffer[0],	/* *pvReceiveData  */
	//				  100L) != DRV_NO_ERROR  )		/* ulTimeout       */
	//		return ERROR_ID;
	//	else 
			;//return	SUCCESS;
		Sleep(1);
	}
	return 0;
}

int CIO::GetAnalog()
{
	WORD size;
	BYTE pBuffer;
	
	Fnio.IoReadInputByteData(DeviceID, 4, &pBuffer, size);
	
	Sleep(50);
	
	return pBuffer;
}
